home *** CD-ROM | disk | FTP | other *** search
- /*******************************************************************************
- +
- + LEDA 2.1.1 11-15-1991
- +
- +
- + p_dictionary.h
- +
- +
- + Copyright (c) 1991 by Max-Planck-Institut fuer Informatik
- + Im Stadtwald, 6600 Saarbruecken, FRG
- + All rights reserved.
- +
- *******************************************************************************/
-
-
-
-
- #ifndef P_DICTIONARY_H
- #define P_DICTIONARY_H
-
- #include <LEDA/pers_tree.h>
-
-
- typedef NODE* p_dic_item;
-
-
- #define PERS_DIC(keytype,infotype) name3(keytype,infotype,PERS_DIC)
-
- #define p_dictionary(keytype,infotype) name3(keytype,infotype,p_dictionary)
-
- #define p_dictionarydeclare2(keytype,infotype)\
- \
- struct PERS_DIC(keytype,infotype): public pers_rb_tree{\
- \
- void copy_key(ent& x) { Copy(*(keytype*)&x); }\
- void copy_inf(ent& x) { Copy(*(infotype*)&x); }\
- void clear_key(ent& x) { Clear(*(keytype*)&x); }\
- void clear_inf(ent& x) { Clear(*(infotype*)&x); }\
- void print_key(ent& x) { Print(*(keytype*)&x); }\
- int cmp_keys(ent& x, ent& y) { return compare(*(keytype*)&x, *(keytype*)&y); }\
- \
- version V;\
- int count;\
- \
- public:\
- \
- PERS_DIC(keytype,infotype)() { init_tree(); V = v_list->vl.first(); count=1;}\
- PERS_DIC(keytype,infotype)(V_LIST* vl,version v) { v_list=vl; V=v; count=1;}\
- void CLEAR() { if (--v_list->count==0) del_tree(); }\
- ~PERS_DIC(keytype,infotype)() { CLEAR(); }\
- \
- PERS_DIC(keytype,infotype)(PERS_DIC(keytype,infotype)& D)\
- { v_list = D.v_list; v_list->count++; V = D.V; count = D.count; }\
- \
- PERS_DIC(keytype,infotype)& operator=(PERS_DIC(keytype,infotype)& D)\
- { CLEAR(); v_list = D.v_list; v_list->count++; V = D.V; count = D.count;\
- return *this; }\
- \
- keytype key(NODE* p) { return keytype(pers_rb_tree::key(p)); }\
- infotype inf(NODE* p) { return infotype(pers_rb_tree::inf(p)); }\
- \
- NODE* locate(keytype k) { return pers_rb_tree::locate(Ent(k),V); }\
- NODE* locate_pred(keytype k) { return pers_rb_tree::locate_pred(Ent(k),V); }\
- NODE* lookup(keytype k) { return pers_rb_tree::lookup(Ent(k),V); }\
- \
- PERS_DIC(keytype,infotype) insert(keytype k, infotype i)\
- { return PERS_DIC(keytype,infotype)(v_list,pers_rb_tree::insert(Ent(k),Ent(i),V)); }\
- \
- PERS_DIC(keytype,infotype) del(keytype k)\
- { return PERS_DIC(keytype,infotype)(v_list,pers_rb_tree::del(Ent(k),V)); }\
- \
- PERS_DIC(keytype,infotype) change_inf(NODE* p, infotype i)\
- { return PERS_DIC(keytype,infotype)(v_list,pers_rb_tree::change_inf(p,Ent(i),V)); }\
- \
- NODE* min() { return pers_rb_tree::min(V); }\
- NODE* max() { return pers_rb_tree::max(V); }\
- NODE* succ(NODE* p) { return pers_rb_tree::succ(p,V); }\
- NODE* pred(NODE* p) { return pers_rb_tree::pred(p,V); }\
- int size() { return pers_rb_tree::size(V); }\
- void print() { pers_rb_tree::print(V); }\
- void draw(DRAW_NODE_FCT f, DRAW_EDGE_FCT g, double x0, double x1, double y, double dy) { pers_rb_tree::draw(f,g,V,x0,x1,y,dy); }\
- double get_version() { return ver_num(V); }\
- \
- };\
- \
- class p_dictionary(keytype,infotype){\
- \
- PERS_DIC(keytype,infotype)* ptr;\
- \
- public:\
- \
- p_dictionary(keytype,infotype)() { ptr = new PERS_DIC(keytype,infotype); }\
- p_dictionary(keytype,infotype)(int) { ptr = new PERS_DIC(keytype,infotype); }\
- p_dictionary(keytype,infotype)(PERS_DIC(keytype,infotype)* p)\
- { ptr = (PERS_DIC(keytype,infotype)*)p; }\
- \
- p_dictionary(keytype,infotype)(ent p)\
- { ptr = (PERS_DIC(keytype,infotype)*)p; ptr->count++;}\
- \
- void clear() { if (--(ptr->count) == 0) delete ptr; }\
- \
- ~p_dictionary(keytype,infotype)() { clear(); }\
- \
- \
- p_dictionary(keytype,infotype)(p_dictionary(keytype,infotype)& p)\
- { ptr = p.ptr; ptr->count++; }\
- \
- p_dictionary(keytype,infotype)& operator=(const p_dictionary(keytype,infotype)& p)\
- { p.ptr->count++;\
- if (--ptr->count == 0) delete ptr;\
- ptr = p.ptr;\
- return *this;\
- }\
- \
- keytype key(NODE* p) { return ptr->key(p); }\
- infotype inf(NODE* p) { return ptr->inf(p); }\
- \
- NODE* locate(keytype k) { return ptr->locate(k); }\
- NODE* locate_pred(keytype k) { return ptr->locate_pred(k); }\
- NODE* lookup(keytype k) { return ptr->lookup(k); }\
- \
- p_dictionary(keytype,infotype) insert(keytype k, infotype i)\
- { return new PERS_DIC(keytype,infotype)(ptr->insert(k,i)); }\
- \
- p_dictionary(keytype,infotype) del(keytype k)\
- { return new PERS_DIC(keytype,infotype)(ptr->del(k)); }\
- \
- p_dictionary(keytype,infotype) change_inf(NODE* p, infotype i)\
- { return new PERS_DIC(keytype,infotype)(ptr->change_inf(p,i)); }\
- \
- int ref() { return ptr->count; }\
- \
- NODE* min() { return ptr->min(); }\
- NODE* max() { return ptr->max(); }\
- \
- NODE* succ(NODE* p) { return ptr->succ(p); }\
- NODE* succ(keytype k) { return locate(k); }\
- NODE* pred(NODE* p) { return ptr->pred(p); }\
- NODE* pred(keytype k) { return locate_pred(k); }\
- \
- NODE* first_item() { return ptr->min(); }\
- NODE* next_item(NODE* p) { return ptr->succ(p); }\
- \
- int size() { return ptr->size(); }\
- int empty() { return ptr->size()==0; }\
- \
- void print() { ptr->print(); }\
- void draw(DRAW_NODE_FCT f, DRAW_EDGE_FCT g, double x0, double x1, double y, double dy) { ptr->draw(f,g,x0,x1,y,dy); }\
- \
- friend ent Copy(const p_dictionary(keytype,infotype)& D)\
- { D.ptr->count++; return ent(D.ptr); }\
- \
- friend ent Ent(const p_dictionary(keytype,infotype)& D) { return D.ptr; }\
- \
- friend void Clear(p_dictionary(keytype,infotype)& D) { D.clear(); }\
- \
- friend void Print(const p_dictionary(keytype,infotype)&, ostream& = cout) { }\
- \
- friend void Read(const p_dictionary(keytype,infotype)&, istream& = cin) { }\
- };
-
-
- #endif
-